#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll MOD = 1e9 + 7;
ll dp[5005][5005];
int main() {
  int n, m, i, j;
  cin >> n >> m;
  dp[0][0] = 1;
  dp[1][0] = dp[1][1] = 1;
  for (i = 2; i <= n; i++) {
    dp[i][i] = dp[i][i - 1] = 1;
    dp[i][0] = (dp[i - 1][0] + dp[i - 2][0]) % MOD;
    for (j = 1; j <= i - 2; j++) {
      dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j] + dp[i - 2][j] + MOD -
                  dp[i - 2][j - 1]) %
                 MOD;
    }
  }
  cout << dp[n][m] % MOD;
  return 0;
}
/*
dp[i][j] 表示：n个抽屉，锁死m个抽屉时的方法数    通过这条定义，我们能推断出

dp[n][m] 的情况dp[n][m] =      dp[n−1][m] + dp[n−2][m] + dp[n−3][m−1] + dp[n−4][m−2] +
dp[n−5][m−3] +…+         dp[n−m−2][0]
分别表示最后1个不锁；最后1个锁，倒数第2个不锁；最后2个锁，倒数第3个不锁；最后3个锁，倒数第4个不锁；最后4个锁，倒数第5个不锁…
dp[i][j] = dp[i−1][j] + dp[i−2][j] + dp[i−3][j−1] +
                           dp[i−4][j−2] + dp[i−5][j−3] +…+
                           dp[i−j−2][0]

那么又可以知道dp[i−1][j−1] =
 dp[i−2][j−1] + dp[i−3][j−1] + dp[i−4][j−2] +
 dp[i−5][j−3] + dp[i−6][j−4] +…+
 dp[i−j−2][0]
 我们发现出了     dp[i−1][j], dp[i−2][j] 后一项没有，以及dp  [i−2][j−1] 
 这一项前一项没有，其他的都重合了。
 所以状态转移方程为 dp[i][j] =    dp[i−1][j−1] + dp[i−1][j] +
  dp[i−2][j]−dp[i−2][j−1]
那么为了防止负数取模，我们加上Mod在取模.
*/